{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(200, 1) float64\n",
      "(200, 1)\n",
      "(200, 1) float64\n",
      "0 0.3595666\n",
      "20 0.0062810197\n",
      "40 0.005968654\n",
      "60 0.0057035936\n",
      "80 0.005450571\n",
      "100 0.0052087354\n",
      "120 0.0049773413\n",
      "140 0.00475574\n",
      "160 0.0045433566\n",
      "180 0.0043396936\n",
      "200 0.004144308\n",
      "220 0.0039568054\n",
      "240 0.003776839\n",
      "260 0.0036041045\n",
      "280 0.0034383202\n",
      "300 0.0032792387\n",
      "320 0.0031266396\n",
      "340 0.0029803095\n",
      "360 0.0028400635\n",
      "380 0.0027057284\n",
      "400 0.0025771349\n",
      "420 0.0024541304\n",
      "440 0.002336561\n",
      "460 0.0022242856\n",
      "480 0.002117162\n",
      "500 0.002015052\n",
      "520 0.0019178187\n",
      "540 0.0018253246\n",
      "560 0.0017374353\n",
      "580 0.0016540119\n",
      "600 0.0015749186\n",
      "620 0.0015000141\n",
      "640 0.0014291628\n",
      "660 0.00136222\n",
      "680 0.0012990481\n",
      "700 0.001239503\n",
      "720 0.001183445\n",
      "740 0.0011307318\n",
      "760 0.0010812209\n",
      "780 0.001034774\n",
      "800 0.0009912512\n",
      "820 0.00095051544\n",
      "840 0.00091243297\n",
      "860 0.00087686715\n",
      "880 0.0008436902\n",
      "900 0.0008127756\n",
      "920 0.00078399724\n",
      "940 0.000757236\n",
      "960 0.0007323767\n",
      "980 0.0007093068\n",
      "1000 0.0006879163\n",
      "1020 0.0006681028\n",
      "1040 0.0006497659\n",
      "1060 0.00063281064\n",
      "1080 0.0006171471\n",
      "1100 0.0006026884\n",
      "1120 0.00058935286\n",
      "1140 0.0005770615\n",
      "1160 0.0005657425\n",
      "1180 0.0005553259\n",
      "1200 0.00054574583\n",
      "1220 0.00053694216\n",
      "1240 0.00052885717\n",
      "1260 0.0005214363\n",
      "1280 0.00051462866\n",
      "1300 0.0005083884\n",
      "1320 0.00050267036\n",
      "1340 0.00049743435\n",
      "1360 0.00049264054\n",
      "1380 0.0004882565\n",
      "1400 0.0004842472\n",
      "1420 0.00048058256\n",
      "1440 0.00047723443\n",
      "1460 0.00047417634\n",
      "1480 0.00047138543\n",
      "1500 0.000468838\n",
      "1520 0.00046651452\n",
      "1540 0.00046439545\n",
      "1560 0.0004624638\n",
      "1580 0.00046070345\n",
      "1600 0.0004590991\n",
      "1620 0.00045763806\n",
      "1640 0.00045630775\n",
      "1660 0.00045509666\n",
      "1680 0.00045399426\n",
      "1700 0.00045299114\n",
      "1720 0.00045207862\n",
      "1740 0.00045124843\n",
      "1760 0.00045049324\n",
      "1780 0.00044980657\n",
      "1800 0.00044918255\n",
      "1820 0.0004486154\n",
      "1840 0.0004480995\n",
      "1860 0.00044763065\n",
      "1880 0.0004472047\n",
      "1900 0.00044681726\n",
      "1920 0.00044646554\n",
      "1940 0.00044614592\n",
      "1960 0.00044585526\n",
      "1980 0.00044559143\n",
      "weight_1 [[ 0.19066207 -0.1587237  -0.84086984  1.0567833  -0.36785483  0.70311373\n",
      "   0.3585087  -0.9613376  -1.884036   -1.410078  ]]\n",
      "bias_1 [[ 0.25136748 -0.1612979   0.11131947 -0.19091834  0.03484557 -0.01531712\n",
      "  -0.29335704 -0.19758013 -0.05011972  0.42855698]]\n",
      "weight_2 [[ 0.81988585]\n",
      " [-0.5030427 ]\n",
      " [-1.2669734 ]\n",
      " [ 0.6513195 ]\n",
      " [ 0.13753761]\n",
      " [-1.2336559 ]\n",
      " [-1.2957659 ]\n",
      " [ 1.7930993 ]\n",
      " [ 0.07011827]\n",
      " [-1.030188  ]]\n",
      "bias_2 [[0.35576853]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 创建数据：二次曲线的分布 + 噪声\n",
    "# ----\n",
    "# 创建从-0.5到0.5的等差数列，长度为200\n",
    "line_data = np.linspace(-0.5, 0.5, 200)\n",
    "# 为创建的数组再增加一个轴\n",
    "x_data = line_data[:, np.newaxis]\n",
    "noise = np.random.normal(0, 0.02, x_data.shape)\n",
    "\n",
    "y_data = np.square(x_data) + noise\n",
    "\n",
    "# 看下数据的类型和shape 注意python中float位数变换会导致数组变长或变短，需要astype\n",
    "print(noise.shape, noise.dtype)\n",
    "print(x_data.shape)\n",
    "print(y_data.shape, y_data.dtype)\n",
    "\n",
    "# 定义两个placeholder用来feed数据，分别代表x和y --1列\n",
    "x = tf.placeholder(tf.float32, [None, 1])\n",
    "y = tf.placeholder(tf.float32, [None, 1])\n",
    "\n",
    "# ----\n",
    "# 构建神经网络进行训练\n",
    "# 假定：\n",
    "#   --一个隐含层L1\n",
    "#   --十个神经元\n",
    "# ----\n",
    "\n",
    "# 定义第一层的weight和bias, 都是1*10的矩阵, 初始化分别为正态随机和0.0\n",
    "weight_1 = tf.Variable(tf.random_normal([1, 10]))\n",
    "bias_1 = tf.Variable(tf.zeros([1, 10]))\n",
    "a_L1 = tf.matmul(x, weight_1) + bias_1\n",
    "z_L1 = tf.nn.tanh(a_L1) # 这里用tanh更好一些\n",
    "\n",
    "# 定义第二层的weight和bias，10*1的矩阵和1*1的矩阵，初始化分别为正态随机和0.0\n",
    "weight_2 = tf.Variable(tf.random_normal([10, 1]))\n",
    "bias_2 = tf.Variable(tf.zeros([1, 1]))\n",
    "a_L2 = tf.matmul(z_L1, weight_2) + bias_2\n",
    "y_head = tf.nn.tanh(a_L2) # 这里也是用tanh更好一些\n",
    "                     \n",
    "# 定义二次损失函数并依据梯度下降法进行训练 -- 这样梯度下降的train就变成了x和y的函数\n",
    "loss = tf.reduce_mean(tf.square(y - y_head))\n",
    "optimizer = tf.train.GradientDescentOptimizer(0.1)\n",
    "train = optimizer.minimize(loss)\n",
    "\n",
    "init = tf.global_variables_initializer()\n",
    "\n",
    "# 运行梯度下降4000次并打印每次的结果和对应的损失函数\n",
    "with tf.Session() as session:\n",
    "    session.run(init)\n",
    "    i = 0\n",
    "    for step in range(2000):\n",
    "        session.run(train, feed_dict= {x: x_data, y: y_data}) # 此处是最小化\n",
    "        ls = session.run(loss, feed_dict= {x: x_data, y: y_data}) \n",
    "        # 注意这里不是ls = session.run(loss), 因为loss也是DAG, 也是x和y的函数，因此同样需要feed，\n",
    "        #tf中常量和运行结果可以直接打印，其他都要run后打印\n",
    "        if(i % 20 == 0):\n",
    "            print(step, ls) # 每隔二十次打印损失，观察收敛情况\n",
    "        i += 1 \n",
    "    \n",
    "    # 训练的神经网络模型中的两层的w和b\n",
    "    print(\"weight_1\", session.run(weight_1))\n",
    "    print(\"bias_1\", session.run(bias_1))\n",
    "    print(\"weight_2\", session.run(weight_2))\n",
    "    print(\"bias_2\", session.run(bias_2))\n",
    "    \n",
    "    # 预测结果\n",
    "    predict = session.run(y_head, feed_dict= {x: x_data}) # 这里y_head即预测结果，注意同样是一个DAG，是x的函数，因此需要feed\n",
    "\n",
    "    # 利用matplot展示执行效果\n",
    "    plt.figure()\n",
    "    plt.scatter(x_data, y_data) # 训练数据用散点图展示\n",
    "    plt.plot(x_data, predict, 'r-', lw = 3) # 预测值用曲线展示，r表示红色，-表示实现，lw为曲线粗细\n",
    "    plt.show()\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
